package com.example.demo;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.example.demo.core.base.BaseModel;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@SpringBootTest
@Slf4j
public class MybatisGenerator {

    private static final String JAVA_SRC = "/src/main/java";

    private static final String JAVA_RESOURCES = "/src/main/resources";

    @Autowired
    private DataSource dataSource;

    @Test
    void test() {
        String packageName = "com.example.demo.mybatis";// 包名
        String[] tables = {"T_DEMO"};// 需要生成实体的表名
        String[] tablePrefixes = {"T_"};// 需要过滤的表前缀
        String projectPath = System.getProperty("user.dir");
        String author = System.getProperty("user.name");
        FastAutoGenerator.create(new DataSourceConfig.Builder(dataSource))
                // 全局配置
                .globalConfig(builder -> {
                    builder.disableOpenDir() // 禁止打开输出目录
                            .author(author)// 作者
                            .dateType(DateType.TIME_PACK)// 时间策略
                            .commentDate("yyyy-MM-dd HH:mm:ss")// 注释日期
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(projectPath + JAVA_SRC); // 指定输出目录
                })
                // 模板配置
                .templateConfig(builder -> {
                    builder.disable(TemplateType.CONTROLLER)// 禁用生成controller
                            .entity("/templates/mybatis/entity.java")// 自定义entity模板
                            .serviceImpl("/templates/mybatis/serviceImpl.java");// 自定义serviceImpl模板
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent(packageName); // 设置父包名
                    builder.mapper("dao");
                    Map<OutputFile, String> paths = new HashMap<>();
                    paths.put(OutputFile.mapperXml, projectPath + JAVA_RESOURCES + "/sqlmap");
                    builder.pathInfo(paths);// 设置文件生成路径
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tables) // 设置需要生成的表名
                            .addTablePrefix(tablePrefixes) // 设置过滤表前缀
                            .entityBuilder()// 配置entity策略
                            .superClass(BaseModel.class)// 设置实体父类
                            .enableLombok() // 开启lombok模型
                            .enableChainModel()// 开启链式调用
                            .mapperBuilder()
                            .enableMapperAnnotation();//开启 @Mapper 注解
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
        log.info("mybatis逆向工程创建成功！");
    }
}
